#include "ap3216_drv.h"

/**
 * @desc  : ap3216c初始化
 * @date  : 2025-09-30
 * @author: AnRui
 * @note  :
 *       设置工作模式
 *       000：掉电模式（默认状态），传感器不工作，功耗最低。
 *       001：仅环境光（ALS）功能使能，传感器只进行环境光强度的检测。
 *       010：接近（PS） + 红外（IR）功能使能，传感器可进行接近测距和红外相关检测。
 *       011：环境光（ALS）以及接近（PS） + 红外（IR）功能同时使能，传感器同时开展这几类检测。
 *       100：软件复位，用于对传感器进行软件层面的重置操作。
 *       101：环境光（ALS）功能单次运行，即只执行一次环境光检测后回到相应状态。
 *       110：接近（PS） + 红外（IR）功能单次运行，只执行一次接近和红外检测。
 *       111：环境光（ALS）以及接近（PS） + 红外（IR）功能单次运行，同时执行一次这几类检测。
 */
bool ap3216c_init(void)
{
  uint8_t config_info[2] = { 0x04,0x01 };// 配置值 0x04:软件复位  0x03 环境光（ALS）以及接近（PS） + 红外（IR）功能同时使能
  I2cStatusCode_e result = I2C_RESULT_OK;
  uint8_t tmp = 0x00;
  AP_I2C_INIT();
  // 向ap3216c发送复位命令 0x04
  result = AP_I2C_WRITE(AP3216C_ADDR, AP3216C_SYSTEMCONG, &config_info[0], 1);
  if (result != I2C_RESULT_OK) return false;
  DwtDelayNms(500);
  // 向ap3216c发送 使能环境光功能命令
  result = AP_I2C_WRITE(AP3216C_ADDR, AP3216C_SYSTEMCONG, &config_info[1], 1);
  if (result != I2C_RESULT_OK) return false;
  //查询ap3216c配置寄存器的值 跟设置的是否一致
  result = AP_I2C_READ(AP3216C_ADDR, AP3216C_SYSTEMCONG, &tmp, 1);
  if (result != I2C_RESULT_OK) return false;
  if (tmp != config_info[1]) return false;
  return true;
}

/**
 * @desc  : 读取光强数据
 * @date  : 2025-09-30
 * @author: AnRui
 * @param : ap_als_value - {参数说明}:
 * @return: int  -1:获取失败
 * @note  : 需要注意的是：读取间隔至少要大于 112.5ms，因为， AP3216C 内部完成一次ALS+PS+IR 的数据转换，需要 112.5ms 的时间
 *
 */
int ap3216c_get_als(void)
{
  uint16_t tmp_als = 0;
  I2cStatusCode_e result = I2C_RESULT_OK;
  // Cortex-M 内核统一采用小端模式，16 位数据 0x1234 在内存中存储为：低地址 0x34，高地址 0x12
  // 读取ap3216c的光强数据 传入 ALS数据低字节地址  先读低8位 后读高8位 保存到 ap_als_value中
  result = AP_I2C_READ(AP3216C_ADDR, AP3216C_ALSDATALOW, (uint8_t*)&tmp_als, 2);
  if (result != I2C_RESULT_OK) return -1;
  return (int)tmp_als;
}
